A storage array or disk array is a data storage device that includes multiple disk drives or similar persistent storage units. A storage array can allow large amounts of data to be stored in an efficient manner. A storage array also can provide redundancy to promote reliability, as in the case of a Redundant Array of Inexpensive Disks (RAID) storage array. A storage array commonly also includes a suitable enclosure, power supply, one or more controllers (typically in the form of one or more circuit boards), and interfaces to connect the storage array to an external host, such as a computer or network device. The controller includes the intelligence or logic (i.e., a client) that causes the storage array to read or write data to or from its persistent storage in response to requests received from an external host.
Some storage arrays include cache memory in which the controller temporarily stores data that has been read from or written to the disks or other persistent storage. Caching is a technique by which data that recently has been read from or written to persistent storage is stored in a random-access, semiconductor memory, so that it can be accessed more quickly than if it were required to access the persistent storage again.
One type of RAID storage array includes two controllers that share access to the persistent storage. Transaction logic is commonly employed to allow the two controllers to share access to the persistent storage without interfering with one another. A transaction, as the term is used in the context of databases, is a database operation that is ensured by the transaction logic to be performed in an “all or nothing” manner, so that the operation is either completed in its entirety or has no effect. Transaction logic also ensures that each transaction is isolated from all other transactions.
Some dual-controller storage arrays include cache memory. Providing a caching feature in a dual-controller storage array requires special design considerations to ensure that the controllers maintain cache data coherency between the cache memories under control of the respective controllers. In some dual-controller storage arrays that have a caching feature, the data stored in the cache memory that is under the control of one controller is copied to the cache memory that is under the control of the other controller. This method is sometimes referred to as “mirrored caching.” Although copying data provides the requisite cache data coherency, it consumes time and system resources and thus can be inefficient.
Another method by which the problem of maintaining cache data coherency has been addressed involves caching data read from or written to persistent storage for no longer than a single transaction (during which time it is ensured that the other controller cannot access persistent storage). A disadvantage of this method is that the amount of data that can be cached is limited to that which is useful during only a single transaction. Typically, only data that the controller needs to access multiple times during the transaction is cached, such as directory pointers and file system structures in an instance in which the transaction involves reading multiple chunks of data from persistent storage. Cached data is discarded when the transaction is completed.